/**
	This file is part of Fighting Field.

    Fighting Field is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    Fighting Field is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with Fighting Field.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef FF_SELECTMENU_H
#define FF_SELECTMENU_H

#include "Prerequisites.h"

#include "Widget.h"

namespace Ogre
{
	class BorderPanelOverlayElement;
	class PanelOverlayElement;
}

namespace FF
{
	class SelectMenu : public Widget
	{
	public:
		struct Style
		{
			Ogre::String templateName;
			Ogre::String itemTemplateName;
			Ogre::String smallBoxUpBorderMaterialName;
			Ogre::String smallBoxUpMaterialName;
			Ogre::String smallBoxOverBorderMaterialName;
			Ogre::String smallBoxOverMaterialName;
			Ogre::String itemUpBorderMaterialName;
			Ogre::String itemUpMaterialName;
			Ogre::String itemOverBorderMaterialName;
			Ogre::String itemOverMaterialName;
		};

	public:
		// Do not instantiate any widgets directly. Use GuiManager.
		SelectMenu(const Ogre::String& name, const Style& style, const Ogre::DisplayString& caption, Ogre::Real width, 
			Ogre::Real boxWidth, unsigned int maxItemsShown);

		bool IsExpanded();

		const Ogre::DisplayString& GetCaption();
		void SetCaption(const Ogre::DisplayString& caption);

		const Style& GetStyle() const { return mStyle; }

		const Ogre::StringVector& GetItems();
		unsigned int GetNumItems();
		void SetItems(const Ogre::StringVector& items);
		void AddItem(const Ogre::DisplayString& item);
		void RemoveItem(const Ogre::DisplayString& item);
		void RemoveItem(unsigned int index);
		void ClearItems();
		void SelectItem(unsigned int index, bool notifyListener = true);
		void SelectItem(const Ogre::DisplayString& item, bool notifyListener = true);
		Ogre::DisplayString GetSelectedItem();
		int GetSelectionIndex();

		// callbacks
		void _OnCursorPressed(const Ogre::Vector2& cursorPos);
		void _OnCursorReleased(const Ogre::Vector2& cursorPos);
		void _OnCursorMoved(const Ogre::Vector2& cursorPos);
		void _OnFocusLost();

	protected:
		void SetDisplayIndex(unsigned int index);

		void Retract();

	protected:
		Style mStyle;
		Ogre::BorderPanelOverlayElement* mSmallBox;
		Ogre::BorderPanelOverlayElement* mExpandedBox;
		Ogre::TextAreaOverlayElement* mTextArea;
		Ogre::TextAreaOverlayElement* mSmallTextArea;
		Ogre::BorderPanelOverlayElement* mScrollTrack;
		Ogre::PanelOverlayElement* mScrollHandle;
		std::vector<Ogre::BorderPanelOverlayElement*> mItemElements;
		unsigned int mMaxItemsShown;
		unsigned int mItemsShown;
		bool mCursorOver;
		bool mExpanded;
		bool mFitToContents;
		bool mDragging;
		Ogre::StringVector mItems;
		int mSelectionIndex;
		int mHighlightIndex;
		int mDisplayIndex;
		Ogre::Real mDragOffset;
	};
}

#endif